#强制类型转换：类型（变量）强制转换
"""
number 数字类型，包括int,float,bool,complex
string 字符串
list 列表
tuple 元组
set 集合
dictionary 字典
"""

#特别：转换成dict
a=[1,2,3,4]
b=[5,6,7]
c=zip(a,b)
print(c)#<zip object at 0x000001FC9161FAC0>
print(dict(c))#{1: 5, 2: 6, 3: 7}
#总结：需要使用zip打包决定key和value
#传递引用
d=1
print(id(d))#输出140717483230120，即d的地址
d2=1
print(id(d2))#输出140717483230120，说明相同类型和值的两个变量共享相同的地址
d3=str(1)
print(id(d3))#输出1633103146720，说明不同类型的变量地址不同
d4=d2
print(d4,id(d4))#1 140717634880424，说明引用本质上是传址
#拷贝
import copy
test1=[1,2,3,4,5]
test1_copy=copy.copy(test1)
print(test1_copy)#[1, 2, 3, 4, 5]
print(id(test1),id(test1_copy))#2571225563904 2571225321344,说明使用copy传参实际上是传值而非传址
#不可变对象
#定义：int,bool,float,complex,str,tuple的存储空间保存的数据不能被修改（如果值变化地址就会变化）
i=1
print(id(i))#140717634880424
i+=2
print(id(i))#140717634880488，地址变了
#可变对象：内容改变地址不变

#函数
'''
定义格式
def 函数名（）：
（缩进）函数体    
'''
def start():
    print('hello world!')
#使用help查看函数参数
help(print)
'''print(*args, sep=' ', end='\n', file=None, flush=False)
    Prints the values to a stream, or to sys.stdout by default.

    sep
      string inserted between values, default a space.
    end
      string appended after the last value, default a newline.
    file
      a file-like object (stream); defaults to the current sys.stdout.
    flush
      whether to forcibly flush the stream.
'''
#调用：先定义再调用
#返回值（return）
def num():
    num1=10
    tuple1=(1,2,3)
    list1=[4,5,6]
    return num1,tuple1,list1
print(num())#输出(10, (1, 2, 3), [4, 5, 6])
ans=num()
print(type(ans))#输出<class 'tuple'>，说明返回多个值按照元组形式
#第一个return结束后，之后所有语句都不执行
#函数的参数：
#def calculate_add(n1,n2):
 #   return n1+n2
#s1=int(input("请输入第一个值"))
#s2=int(input('请输入第二个值'))
#print(f'结果为{calculate_add(s1,s2)}')
'''参数类型：
必选参数：数量严格固定的参数
默认参数：给某个参数一个固定的值
可变参数：将该位置所有参数接收传到元组中（*orgs）
关键字参数：将元素转化为字典赋值给形参（**kwargs）
'''
def moren(aa=12):
    print(f'aa={aa}')
moren()#aa=12
moren(5)#aa=5
#不定长参数：一个*，类型是tuple
def long(*test):
    print(test)
long(test1,2,3,4,5)#输出([1, 2, 3, 4, 5], 2, 3, 4, 5)
#关键字参数：传参格式：形参key=value实参
def keywords(**kwargs):
    print(kwargs)
keywords(name='uni',age=18,gender='m')#{'name': 'uni', 'age': 18, 'gender': 'm'}
#命名关键字参数：使用*分隔，前面是必须参数，后面是关键字
def keywords2(name,age,*,gender='m',city='beijing'):
    print(name,age,gender,city)
keywords2('uni',18,gender='m',city='Jiujiang')#uni 18 m Jiujiang
